from functools import wraps
from flask import g, redirect, url_for


def login_required(func):    # 所以func就是函数public_question
    @wraps(func)  # 保留func的信息
    # *args允许函数从调用者那里接收任意数量的位置参数，并将这些参数作为元组传递给函数。这里的“args”只是一个约定俗成的名称，
    # 实际上你可以使用任何名称，只要在前面加上星号（ * ）。然而，“args”是最常用的名称，因为它简洁地表示“arguments”（参数）。
    # --------------------------------------------------------------------------------------------------------
    # 与*args类似，**kwargs允许函数接受任意数量的关键字参数，并将这些参数作为字典传递给函数。这里的“kwargs”是“keyword
    # arguments”（关键字参数）的缩写，同样地，你可以使用其他名称，只要在前面加上两个星号（ ** ）。然而，“kwargs”是最常用的名称。
    def inner(*args, **kwargs):
        if g.user:    # hasattr(g, "user") hasattr它用于检查一个对象是否有指定的属性或方法。
            return func(*args, **kwargs)
        else:
            return redirect(url_for("auth.login"))
    return inner

# 举个例子,

# @login_required
# def public_question(question_id):
#     pass

# 这么用的话就是login_required(public_question),这个函数执行完之后，还会返回一个函数inner。
# 所以这会就把question_id传给函数inner，判断有没有user，如果有就正常执行函数func也就是public_question，执行public_question(question_id)
# 如果你没有登录就跳转到登录页面return redirect(url_for("auth.login"))



























